package ua.diploma.chat;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.apache.log4j.Logger;

public class ChatServiseImpl implements ChatServise {

	private List<String> users = new LinkedList<String>();

	private static final ChatServiseImpl instance = new ChatServiseImpl();

	private static final Logger log = Logger.getLogger(ChatServiseImpl.class);

	private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

	private ChatServiseImpl() {
		super();
	}

	public static ChatServise getInstance() {
		return instance;
	}

	@Override
	public void registerUser(String userName)
			throws UserAlreadyRegisteredException {
		log.info("Регистрация в чате ---> Имя пользователя " + userName);
		Lock lock = readWriteLock.writeLock();
		try {
			lock.lock();
			if (users.contains(userName))
				throw new UserAlreadyRegisteredException(
						"Юзер уже зарегестирован в чате");
			users.add(userName);
			log.info(users);
			// тут будет рассылка юзера всем остальным
		} finally {
			lock.unlock();
		}

	}

	@Override
	public void unRegisterUser(String userName)
			throws UserNotRegisteredException {
		log.info("Выход из чата ---> Имя пользователя " + userName);
		Lock lock = readWriteLock.writeLock();
		try {
			lock.lock();
			if (!users.contains(userName))
				throw new UserNotRegisteredException(
						"Юзера не зарегестрирован в чате");
			users.remove(userName);
			log.info(users);
			//рассылка выхода юзера из чата
		} finally {
			lock.unlock();
		}
	}

}
